#include <stdio.h>

/*ler valor introduzido na consola*/
int getInt(){ 
	int i=0, c, f=1; 
	/* i é o inteiro a retornar
	 * c é o char lido do teclado 
	 * flag f que indica que é negativo*/
	
	/*le da consola  enquanto for diferente de ' ' ou '\n' ou final de ficheiro*/
	while((c=getchar())!=' ' && c!= EOF && c!='\n'){
		if(c>='0' && c<='9')
			i=(i*10)+(c-'0');
		else if(c == '-') f=-1; /*caso seja '-' poe a flag a -1*/
	}
	return i*f;
}

unsigned long int max_value (int bytes){
	int bits; 
	unsigned long int val2, val1, ret;
	unsigned long int val= ~0;
	
	/*da o valor total de bits a usar*/
	bits = bytes * 8;
	
	/*caso o nº de bytes introduzido for negativo 
	 * e necessario multiplica os bits por -1 para
	 * o tornar positivo para assim nao dar erros nas contas*/
	if(bytes < 0)
		bits = bits*(-1);
	
	/*val2 dá o maior valor posssivel em bits de um signed long int*/
	/*bitMaiorPesoPossivel*/ val2 = (1<<((sizeof(long int)*8)-1));
	/*bitMaiorPesoBitIntroduzido*/ val1 = (1<<bits); 
		
		
	/*se o bit maior peso do byte introduzido for maior que o suportado pelo sistema
	 * retorna -1*/
	if(val1 >= val2)
		return -1;
	
	/*caso contrario calcula o valor maior possivel*/
	if(bytes < 0)
		ret = (val>>((val2 - bits)+1));
	ret = (val>>(val2 - bits));
	
	return ret;
}

int main (){
	
	int bytes = getInt();
	unsigned long int ret = max_value(bytes);


	
	if(bytes < 0){
		if((bytes*-1) == sizeof(int)){
			printf("O maior valor possivel de escrever num signed int é %lu.\n", ret);
		}else{
			if((bytes*-1) == sizeof(short int))
				printf("O maior valor possivel de escrever num signed short int é %lu.\n", ret);
		}
	}
	else{
		if(bytes == sizeof(int)){
			printf("O maior valor possivel de escrever num unsigned int é %lu.\n", ret);
		}else{
			if(bytes == sizeof(short int))
				printf("O maior valor possivel de escrever num unsigned short int é %lu.\n", ret);
		}
	}
	printf("O maior valor possivel de escrever com %d byte(s) é %lu.\n", bytes, ret);
	
	return 0;	
}
